/**
 * 类型别名
 * 用来给一个类型起个新名字
 * 语法: type 新名字 = 旧名字
 * 作用: 简化类型书写
 * 可以使用类型别名为任何类型命名
 */

type MyType = {
    x: number,
    y: number
}
// type ID = number | string
function printCoord(pt: MyType) {
    console.log(pt.x)
    console.log(pt.y)
}
printCoord({x: 1, y: 2})

/**
 * 接口：接口声明属于另一种方式命名对象类型
 * 语法: interface 接口名 {属性名: 属性类型}
 * 接口可以限制一个对象的接口，对象只有包含接口中定义的所有属性和方法才能匹配接口
 * 
 * 和类型别名的区别
 * 1.接口可以在任何地方使用，而类型别名不能在声明之前使用
 */
/**
 * 接口的扩展
 */
interface Animal {
    name: string
    age: number
}
interface Dog extends Animal {
    breed: string
}
/**
 * 类型别名的扩展
 */
type Animalone = {
    name: string
    age: number
}
type Dogone = Animalone & {
    breed: string
}

/**
 * 向现有接口可以添加新字段
 * 但是类型创建后就不可以修改
 */
interface Animal {
    count: number
}
// type Animalone = {
//     count: number
// }
let a: Animal = {
    name: 'dog',
    age: 1,
    count: 2
}
console.log('动物', a)
